#define _CRT_SECURE_NO_WARNINGS

//#include <iostream>
//using namespace std;
//
//template <typename T>
//class Base {
//protected:
//    T a, b;
//public:
//    Base(T aa, T bb);
//    void show();
//};
//template <typename T>
//Base<T>::Base(T aa, T bb)
//{
//    a = aa; b = bb;
//}
//template <typename T>
//void Base<T>::show()
//{
//    cout << "Base a=" << a << ",b=" << b << endl;
//}
//
//
//class Derive :public Base <float>{
//public:
//    Derive(float, float, float);
//    void show();
//
//protected:
//    float c;
//};
//
//Derive::Derive(float aa = 3.3, float bb = 4.4, float cc = 5) :Base<float>(aa, bb)
//{
//    c = cc;
//}
//void Derive:: show()
//{
//    cout << "Derive a=" << a << ",b=" << b << ",c=" << c << endl;
//}
//int main()
//{
//    Base<int> bb(3, 7);
//    bb.show();
//
//    Derive dd(3.14, 2.72), dt;
//    dd.show();
//    dt.show();
//
//    return 0;
//}

//#include <iostream>
//using namespace std;
//
//template <typename T1,typename T2>
//class Base
//{
//protected:
//    T1 a;
//    T2 b;
//public:
//    Base(T1 aa, T2 bb);
//    void show();
//};
//
//template <typename T1,typename T2>
//Base<T1, T2>::Base(T1 aa, T2 bb)
//{
//    a = aa; b = bb;
//}
//template <typename T1, typename T2>
//void Base<T1, T2>::show()
//{
//    cout << "Base a=" << a << ",b=" << b << endl;
//}
//
//class Derive :public Base<float, int> {
//protected:
//    int c;
//public:
//    Derive(float, int, int);
//    void show();
//};
//Derive::Derive(float aa = 3.3, int bb = 4, int cc = 5) :Base(aa, bb)
//{
//    c = cc;
//}
//void Derive::show()
//{
//    cout<<"Derive a=" << a << ",b=" << b << ",c=" <<c<< endl;
//}
//
//int main()
//{
//    Base<int, int> aa(1, 2);
//    aa.show();
//    Base<int, float> bb(3, 7.7);
//    bb.show();
//    Base<float, char> cc(3.3, 'T');
//    cc.show();
//
//
//    Derive dd(3.14, 2, 5), dt;
//    dd.show();
//    dt.show();
//
//    return 0;
//}


//#include <iostream>
//using namespace std;
//
//
//int a1[] = { 1,2,3,4,5,6,7,8,9,10 };
//double a2[] = { 1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.10 };
//
//template <typename T>
//T SUM(T a[], int n)
//{
//	T ret = 0;
//	for (int i = 0; i < n; i++)
//	{
//		ret += a[i];
//	}
//	return ret;
//}
//
//int main()
//{
//	cout << "SUM(int) is " << SUM(a1, 10) << endl;
//	cout<<"SUM(double) is "<<SUM(a2,10)<<endl;
//}

//#include <iostream>
//using namespace std;
//
//template <typename T1,typename T2>
//void myfun(T1 a, T2 b)
//{
//	cout << a << "  " << b << endl;
//}
//int main()
//{
//	myfun(10, "hao");
//	myfun(0.123, 10L);
//}


//#include <iostream>
//using namespace std;
//
//template <typename T>
//T Max(T a, T b)
//{
//	return a > b ? a : b;
//}
//template<typename T>
//T Max(T a, T b, T c)
//{
//	T tmp = a > b ? a : b;
//	return tmp > c ? tmp : c;
//}
//
//int main()
//{
//	cout << "max(10,20)=" << Max(10, 20)<<endl;
//	cout << "max(10.1,20.2,30.3)=" << Max(10.1, 20.2, 30.3)<<endl;
//}

//#include <iostream>
//using namespace std;
//
//template<typename T>
//T Max(T a, T b)
//{
//	return a > b ? a : b;
//}
//
//int Max(int a, int b)
//{
//	return a > b ? a : b;
//}
//
//int main()
//{
//	cout << "Calling ordinary function:max(int):" << Max(10, 20) << endl;
//	cout << "Calling template function:max(double):" << Max(2.3, 20.2) << endl;
//	cout << "Calling template function:max(char):" << Max('a', 'j') << endl;
//
//}

#include <iostream>
using namespace std;

template<typename T>
class Compare {
private:
	T x, y;
public:
	Compare(T a, T b);
	T Max();
};
template<typename T>
Compare<T>::Compare(T a, T b)
{
	x = a; y = b;
}

template<typename T>
T Compare<T>:: Max()
{
	return x > y ? x : y;
}

int main()
{
	Compare<int> c1(3, 7);
	Compare<double> c2(1.1, 2.2);
	Compare<char> c3('a', 'm');
	cout << "max(int):" << c1.Max() << endl;
	cout << "max(double):" << c2.Max() << endl;
	cout << "max(char):" << c3.Max() << endl;
}